package com.neuedu.corejava.ch8;

public class TryClass {

	public static void main(String[] args) {

		int a = 1, b = 2;
		// 1、异常处理方法try catch
		try {
			int c = a / b;

		} catch (Exception e) {
			// 向上抛出异常
			// throw e;
		}

		// 2、异常处理方法try finally

		try {
			int c = a / b;
		} finally {
			System.out.println("一定会执行的代码");
		}

		// 3、异常处理方法try catch finally
		try {
			int c = a / b;// 可能发生异常代码
		} catch (Exception e) {
			// 发生异常后需要执行的代码
			e.printStackTrace();
		} finally {
			// 不管是否发生异常，一定要执行的代码
			System.out.println("一定会执行的代码");
		}

		// 4、异常处理方法try catch catch finally
		try {
			int c = a / b;// 可能发生异常代码
			int[] array = new int[3];
			array[3] = 5;
		} catch (ArrayIndexOutOfBoundsException e) {// 不存在异常类的父子关系，可以调换异常位置
			// 发生异常后需要执行的代码
			// e.printStackTrace();
			System.out.println("数组下标越界");
		} catch (ArithmeticException e) {// 使用多个catch块时，需要注意的是：异常类的父子关系，父类异常需要放到后面
			System.out.println("发生了算术运行异常");
		} finally {
			// 不管是否发生异常，一定要执行的代码
			System.out.println("一定会执行的代码");
		}

		// 5.try catch finally - JDK1.7以后支持
		try {
			int c = a / b;// 可能发生异常的代码
			int[] array = new int[3];
			array[3] = 5;
		} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {// 使用一个catch捕获多个异常，异常不能有父子关系
			// 发生异常后需要执行的代码
			// e.printStackTrace();
			System.out.println("数组下标越界异常 或  算术运算异常！<><><><><><><><");
			System.exit(0);// 直接退出程序，不指向finally代码块

		} finally {
			// 不管是否发生异常，一定要执行的代码： 如果try或catch中，执行了System.exit(0);则不执行finally
			System.out.println("==========一定会执行的代码============");
		}

		// 6、try catch 多级嵌套
		try {
			try {

			} catch (Exception e) {

			}

		} catch (Exception e) {

		}
		try {

		} catch (Exception e) {

		}

		try {
			System.out.println("执行try");
			int c = 1 / 0;
			return; // 1、返回一个数据值 ； 2、终止一个方法的执行
		} catch (Exception e) {
			System.out.println("执行catch");
		} finally {
			// 在try 或catch 中，如果执行了return语句，finally块还会执行
			System.out.println("执行finally");
		}

		System.out.println("main方法执行完毕");
	}

}
